在上一篇的內容中提到了定義各個層級的變數,其中提到了「工作繼承變數」其原理使用了工作(Job)將要傳遞的變數,寫入環境變數檔案裡頭,而後透過工作成品 artifact 將之傳送到後續需要的工作中使用。那麼 GitLab CI 所提供的工作成品(artifact) 可以做些什麼呢?
在規劃工作流程流水線時,有些工作最終會希望產出一些成果,像是原始碼組譯後的打包成果等等,這時候就可以在工作中定義工作成品(Artifact),將需要產出的檔案搜集起來。
default:
image: centos:7
build:
stage: build
script:
- echo "BUILD_VERSION=hello" >> variable.env
- echo "BUILD_NAME=GitLab" >> variable.env
artifacts:
paths:
- variable.env
如上第一個工作成品範例,在 script
的內容中,將兩個變數的內容輸出到 variable.env
檔案中,而後透過 artifacts
中 paths
的設定,將 variable.env
這個檔案作為工作成品。其在工作執行後,可以見到畫面中顯示,多了一個 Uploading artifacts...
的 Script 在進行,其將定義中的檔案上傳到 GitLab Server 上做封存。
工作成品產出後的檔案放在哪邊呢?其會上傳到 GitLab Server 的空間中,因此其一,可以透過工作產出的連結看到 「Job artifacts」的區域,在這邊可以直接下載(Download),也可以透過瀏覽(Browse)查看產出的檔案。直接下載的工作成品預設會是一個 zip 壓縮檔,內容即是在 artifacts
設定要產出的工作成品。
瀏覽產出的檔案則可以透過介面上直接查看內容,如果是 GitLab 支援直接呈現的檔案也可直接呈現。另外,如有與其他系統介接的需求,也可以透過 GitLab API 取得打包後的檔案。
binaries
資料夾底下的所有檔案及一個 .config
檔:artifacts:
paths:
- binaries/
- .config
*
保留符合模式的檔案,如底下的範例,將會保留路徑符合 path/*xyz/*
路徑底下的檔案們。job:
artifacts:
paths:
- path/*xyz/*
*.o
檔案。artifacts:
paths:
- binaries/
exclude:
- binaries/**/*.o
artifacts:untracked
來進行設定,當設定為 true
時,如 binaries
資料夾底下有未被 GIT 追蹤的檔案,即會列進工作成品中。artifacts:
untracked: true
paths:
- binaries/
提供下載的檔案名稱一定只能叫做 artifact.zip
嗎?當然是可以修改的,只要透過 artifacts:name
這個檔案中來設定,也可以透過環境變數來作定義,例如使用 CI_COMMIT_REF_NAME
就可以以該分支或者是 Git Tag 的標示為檔名,範例如下:
job:
artifacts:
name: "$CI_COMMIT_REF_NAME"
paths:
- binaries/
那麼,產出的工作成品會保存多久呢?目前現行 GitLab 的保存期限預設值為 30 天,其可以透過 artifacts:expire_in
參數來做設定,其支援的設定格式如下,當沒有設定單位的時候,預設為「秒」:
'42'
42 seconds
3 mins 4 sec
2 hrs 20 min
2h20min
6 mos 1 day
47 yrs 6 mos and 4d
3 weeks and 2 days
never
另外,在 GitLab 13.3 版本後,也開始支援永不清除的參數 never
,但使用上必須要特別考量,是否產出的工作成品真的需要永不刪除?畢竟存放在 Server 上是會占系統儲存空間的。
打包工作上的成品也是工作流程設計上很重要的一環,除需要產出什麼內容的成品、成品如何保存、保存多久等,都是需要思考的一部分。
接下來,將繼續往工作流程工作與工作間彼此的關聯討論。我是墨嗓(陳佑竹),期待這系列的文章能夠讓人有些幫助。